//
//  ViewController+swizzling.m
//  SSL_Runtime_Learn
//
//  Created by SSLong on 2018/2/7.
//  Copyright © 2018年 sunshilong. All rights reserved.
//

#import "ViewController+swizzling.h"
#import <objc/runtime.h>
@implementation ViewController (swizzling)
//load方法会在类第一次加载的时候被调用
//调用的时间比较靠前，适合在这个方法里做方法交换

+ (void)load {
    //方法交换应该被保证，在程序中只会执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //
        SEL systemSelector = @selector(viewDidLoad);//系统方法
        SEL swizzSelector = @selector(swizzlingViewDidLoad);//自己方法
        
        Method systemMethod = class_getInstanceMethod([self class], systemSelector);
        Method swizzMethod = class_getInstanceMethod([self class], swizzSelector);
        //首先动态添加方法，实现是被交换的方法，返回值表示添加成功还是失败,成功表示被交换方法不存在，失败表示被交换方法存在可以进行交换
        BOOL isAdd = class_addMethod(self, systemSelector, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));
        if (isAdd) {
            //被交换方法不存在
            NSLog(@"不能交换，可以用动态方法替换不存在的方法");
            class_replaceMethod(self, swizzSelector, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
        }else{
            //可以交换
            NSLog(@"可以交换");
            method_exchangeImplementations(systemMethod, swizzMethod);
        }
        
        
    });
}

// 我们自己实现的方法，也就是和self的viewDidLoad方法进行交换的方法。
- (void)swizzlingViewDidLoad {
    NSString *str = [NSString stringWithFormat:@"%@", self.class];
    // 我们在这里加一个判断，将系统的UIViewController的对象剔除掉
    if(![str containsString:@"UI"]){
        NSLog(@"执行类名字 : %@", self.class);
    }
    [self swizzlingViewDidLoad];//并不会发生死循环
}
- (void)swizzlingViewWillAppear:(BOOL)animated{
    NSLog(@"自定义方法");
}
@end
